#include "ChannelFilter.h"
#include "FilterException.h"
#include <cv.h>

using namespace cv;

ChannelFilter::ChannelFilter(char red, char green, char blue): red(red),green(green),blue(blue){}

void ChannelFilter::process(const Mat& src, Mat& dst)
{
	//chequeo que el tipo de matrices sea válido
	if ((src.type() != CV_8UC3) && !(src.type() != CV_8UC4))
		throw FilterException("src debe ser de tipo CV_8UC3 o CV_8UC4");
	if (src.type() != dst.type() || src.size() != dst.size())
		throw FilterException("dst debe ser del mismo tipo y tamaño que src");

    vector<Mat> planes;
    split(src, planes);

	for(int i = 0; i < src.rows; ++i)
	{
	    uchar* ptrR = planes[0].ptr<uchar>(i); // RED
	    uchar* ptrG = planes[1].ptr<uchar>(i); // GREEN
	    uchar* ptrB = planes[2].ptr<uchar>(i); // BLUE
		for(int j = 0; j < src.cols; ++j)
		{
			short pData;
			// RED
			pData = ptrR[j];
			pData += red;
			if (pData > 255) pData = 255;
			if (pData < 0) pData = 0;
			ptrR[j] = (uchar)pData;

			// GREEN
			pData = ptrG[j];
			pData += green;
			if (pData > 255) pData = 255;
			if (pData < 0) pData = 0;
			ptrG[j] = (uchar)pData;

			// BLUE
			pData = ptrB[j];
			pData += blue;
			if (pData > 255) pData = 255;
			if (pData < 0) pData = 0;
			ptrB[j] = (uchar)pData;
		}
	}

	merge(planes, dst);
}

